#include<bits/stdc++.h>
using namespace std;
int t;
int n,m,L,V;
int d[100005],v[100005],a[100005];
int p[100005],p1[100005],ans1;
bool f[100005],f1[100005];
struct node
{
    int l,r,c;
};
bool cmp(node x,node y)
{
    bool res=1;
    if(x.l>y.l)
    {
        res=0;
    }
    return res;
}
node q[100005],q1[100005];
int l[100005],r[100005];
int main()
{
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    cin>>t;
    while(t--)
    {
        ans1=0;
        cin>>n>>m>>L>>V;
        for(int i=1;i<=n;i++)
        {
            l[i]=-1;
            r[i]=-1;
        }
        for(int i=1;i<=n;i++)
        {
            cin>>d[i]>>v[i]>>a[i];
        }
        for(int i=1;i<=m;i++)
        {
            cin>>p[i];
            p1[i]=p[i];
        }
        for(int i=1;i<=n;i++)
        {
            if(v[i]>V)
            {
                l[i]=d[i];
                if(a[i]>=0)
                {
                    r[i]=L;
                }
                else
                {
                    double a1=V*V-v[i]*v[i];
                    double a2=2*a[i];
                    double s=a1/a2;
                    int s1=s;
                    if(s>s1)
                    {
                        r[i]=min(L,s1+d[i]);
                    }
                    else
                    {
                        r[i]=min(L,s1-1+d[i]);
                    }
                }
            }
            if(v[i]==V)
            {
                if(a[i]>0)
                {
                    l[i]=d[i]+1;
                    r[i]=L;
                }
            }
            if(v[i]<V && a[i]>0)
            {
                double s=(V*V-v[i]*v[i])/(2*a[i]);
                int s1=s;
                if(s>s1)
                {
                    l[i]=d[i]+s;
                }
                else
                {
                    l[i]=d[i]+s+1;
                }
                r[i]=L;
            }
            q[i].l=l[i];
            q[i].r=r[i];
            //cout<<i<<" "<<q[i].l<<" "<<q[i].r<<'\n';
            q[i].c=i;
        }
        sort(q+1,q+1+n,cmp);
        sort(p1+1,p1+1+m);
        int h=0;
        for(int i=1;i<=n;i++)
        {
            if(q[i].l==-1)
            {
                h++;
            }
        }
        int i1=h+1,j1=1;
        while(i1<=n && j1<=m)
        {
            //cout<<q[i1].l<<" "<<q[i1].r<<" "<<p1[j1]<<'\n';
            if(p1[j1]>=q[i1].l && p1[j1]<=q[i1].r)
            {
                f[q[i1].c]=1;
                ans1++;
                i1++;
            }
            else if(p1[j1]<q[i1].l)
            {
                j1++;
            }
            else if(p1[j1]>q[i1].r)
            {
                i1++;
            }
        }
        for(int i=1;i<=h;i++)
        {
            q1[i].c=-1;
        }
        for(int i=h+1;i<=n;i++)
        {
            q1[i].l=lower_bound(p1+1,p1+1+m,q[i].l)-p1;
            q1[i].r=upper_bound(p1+1,p1+1+m,q[i].r)-p1-1;
            if(q1[i].l>q1[i].r) q1[i].c=-1;
            //cout<<i<<" "<<q1[i].l<<" "<<q1[i].r<<'\n';
        }
        sort(q1+1,q1+1+n,cmp);
        int pl=0,ans2=n;
        for(int o=1;o<=n;o++)
        {
            if(q1[o].c==-1) continue;
            if(pl>=q1[o].l && pl<=q1[o].r)
            {
                continue;
            }
            if(q1[o+1].l>q1[o].r)
            {
                ans2--;
            }
            else
            {
                pl=q1[o+1].l;
                ans2--;
            }
        }
        cout<<ans1<<" "<<ans2<<'\n';
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}
